package com.nit.generate;

import com.nit.tools.loop.NitLoopTools;

import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * IP地址生成器
 *
 * @Auth: 逆天开源-逍遥哥哥
 * @link: 1715656022@qq.com
 * @Date: 2023-07-11
 */
public class NitIPGenerator {
    private final static String[] HEX_ARR_STR = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

    public static void main(String[] args) {
        NitLoopTools.loop(4, () -> {
            String tmp = NitIPGenerator.generateV4();
            System.out.println("随机ipv4:" + tmp + "<br>");
        });
        NitLoopTools.loop(4, () -> {
            String tmp = NitIPGenerator.generateV6();
            System.out.println("随机ipv6:" + tmp + "<br>");
        });
    }

    /**
     * IPv6地址总长度为128比特，通常分为8组，每组为4个十六进制数的形式，每组十六进制数间用冒号分隔
     * 获取一个随机IPV6
     */
    public static String generateV6() {
        StringBuilder build = new StringBuilder();
        NitLoopTools.loop(8, () -> build.append(group()).append(":"));
        build.deleteCharAt(build.length() - 1);
        return build.toString();
    }

    private static String group() {
        return Stream.generate(() -> {
            int idx = NitNumberGenerator.generateInt(0, HEX_ARR_STR.length);
            return HEX_ARR_STR[idx];
        }).limit(4L).collect(Collectors.joining());
    }

    public static String generate() {
        return generateV4();
    }

    /**
     * 获取一个随机IPV4
     */
    public static String generateV4() {
        // 指定 IP 范围
        int[][] range = {
                {607649792, 608174079}, // 36.56.0.0-36.63.255.255
                {1038614528, 1039007743}, // 61.232.0.0-61.237.255.255
                {1783627776, 1784676351}, // 106.80.0.0-106.95.255.255
                {2035023872, 2035154943}, // 121.76.0.0-121.77.255.255
                {2078801920, 2079064063}, // 123.232.0.0-123.235.255.255
                {-1950089216, -1948778497}, // 139.196.0.0-139.215.255.255
                {-1425539072, -1425014785}, // 171.8.0.0-171.15.255.255
                {-1236271104, -1235419137}, // 182.80.0.0-182.92.255.255
                {-770113536, -768606209}, // 210.25.0.0-210.47.255.255
                {-569376768, -564133889}, // 222.16.0.0-222.95.255.255
        };

        Random random = new Random();
        int index = random.nextInt(range.length);
        return num2ip(range[index][0] + random.nextInt(range[index][1] - range[index][0]));
    }

    /*
     * 将十进制转换成IP地址
     */
    public static String num2ip(int ip) {
        int[] b = new int[4];
        b[0] = (ip >> 24) & 0xff;
        b[1] = (ip >> 16) & 0xff;
        b[2] = (ip >> 8) & 0xff;
        b[3] = ip & 0xff;
        // 拼接 IP
        return b[0] + "." + b[1] + "." + b[2] + "." + b[3];
    }
}
